object Test extends App {
  println(ReturnTypeRefinement.foo.x)

  case class Foo(i: Int, s: String, b: Boolean)
  def foo[C, L](c: C)(implicit iso: FundepMaterialization[C, L]): L = iso.to(c)
  locally {
    val equiv = foo(Foo(23, "foo", true))
    def typed[T](t: => T): Unit = {}
    typed[(Int, String, Boolean)](equiv)
    println(equiv)
  }

  println(implicitly[DynamicMaterialization[C1]])
  println(implicitly[DynamicMaterialization[C2]])

  42 match {
    case ExtractorMacro(x) => println(x)
    case x => throw new MatchError(x)
  }
}
